package com.sap.sap_mangers.mapper;

import com.sap.sap_mangers.Vo.SawbsVo.ManagerToUserVo.ManagerVo;
import com.sap.sap_mangers.Vo.SawbsVo.SapSawbsApprovalVo;
import com.sap.sap_mangers.Vo.SawbsVo.SawbsMessageVo;
import com.sap.sap_mangers.Vo.SawbsVo.UserToManagerVo;
import com.sap.sap_mangers.dto.sawbs.SawbsMessage;
import com.sap.sap_mangers.dto.sawbs.SawbsSummaryDto;
import com.sap.sap_mangers.dto.sawbs.SawbsTaskSummary;
import com.sap.sap_mangers.dto.sawbs.TaskForWeek;
import com.sap.sap_mangers.pojo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.security.core.parameters.P;

import java.sql.Timestamp;
import java.util.List;

/**
 * @author 樊东升
 * @date 2022/7/31 19:16
 */
@Mapper
public interface SawbsMapper {
    /**
     * 获取学习小组的信息
     *
     * @param sawbsMessage 学习小组的json封装对象，里面有两个属性，year和week
     * @return 学习小组 的视图类用于Json渲染
     */
    List<SawbsMessageVo> getSawbsMessage(@Param("sawbsMessage") SawbsMessage sawbsMessage);

    /**
     * 获取学习小组的信息一次活动
     *
     * @param sawbsMessage 学习小组的json封装对象，里面有两个属性，year和order
     * @return 学习小组 的视图类用于Json渲染
     */
    List<SawbsMessageVo> getSawbsMessageSum(@Param("sawbsMessage") SawbsMessage sawbsMessage);

    /**
     * 通过学号获取当前周的学习分数
     *
     * @param username 学号
     * @return 分数表
     */
    SawbsMessageVo getSawbsMessageByUsername(@Param("username") String username);

    /**
     * 获取当前活动的内容
     *
     * @param year  学年
     * @param order 活动次序
     * @return 当前活动的内容
     */
    Activity getActivityMessage(@Param("year") Integer year, @Param("order") Integer order);

    /**
     * 部长申请成为活动负责人
     *
     * @param username   学号
     * @param topic      活动主题
     * @param context    活动内容
     * @param createTime 申请时间
     * @param year       活动年份
     * @param order      活动次序
     */
    void applyToBeStudyGroupLeader(@Param("username") String username, @Param("topic") String topic, @Param("context") String context, @Param("createTime") Timestamp createTime, @Param("year") Integer year, @Param("order") Integer order);

    /**
     * 获取待审批的成员通过学号筛选，用于防止重复申请(用于后端判断)
     *
     * @param username 被查询的学号
     * @return 待审批的成员
     */
    SapSawbsApproval getApprovalMessageByUsername(@Param("username") String username);

    /**
     * 获取待审批的成员的视图(传给前端)
     *
     * @return 获取待审批的成员
     */
    List<SapSawbsApprovalVo> getApprovalVo();

    /**
     * 会长审批负责人的申请
     *
     * @param username          负责人的学号
     * @param usernameForManger 会长的学号
     * @param endTime           审批时间
     */
    void responsibleForApproval(@Param("username") String username, @Param("usernameForManger") String usernameForManger, @Param("endTime") Timestamp endTime);

    /**
     * 通过审批的加入学习活动负责人表
     *
     * @param username 通过审批的负责人
     */
    void addMangerByUsername(@Param("username") String username);

    /**
     * 获取所有未退出的成员的学号
     *
     * @param year  当前活动年份
     * @param order 当前活动次数
     * @return 未退出的成员的学号的集合
     */
    List<String> getUsersThatHaveNotExited(@Param("year") Integer year, @Param("order") Integer order);

    /**
     * 获取所有未退出的负责人的学号
     *
     * @param year  当前活动年份
     * @param order 当前活动次数
     * @return 未退出的负责人的学号的集合
     */
    List<String> getManagersThatHaveNotExited(@Param("year") Integer year, @Param("order") Integer order);

    /**
     * 添加每周的负责关系
     *
     * @param correspondence 负责关系
     */
    void addManagerCorrespondence(@Param("correspondence") ManagerCorrespondence correspondence);

    /**
     * 添加成员周任务提交记录
     *
     * @param results 成员周任务提交记录
     */
    void addUserSubmitResult(@Param("result") SapSawbsUserResults results);

    /**
     * 获取当前活动周是否有人上传了文件(上传了以后限制不能够在随机匹配人了)
     *
     * @param sawbsMessage 动态信息
     * @return
     */
    List<SapSawbsUserResults> getThisWeekIsPeopleSubmitTask(@Param("sawbsMessage") DynamicMessage sawbsMessage);

    /**
     * 获取当前周未分配负责人的新入人员
     *
     * @param sawbsMessage 动态信息
     * @return
     */
    List<String> getThisWeekNotAllocationManagerPeople(@Param("sawbsMessage") DynamicMessage sawbsMessage);

    /**
     * 获取本周的负责匹配关系id -- 仅用于判断本周是否添加过负责人与成员的匹配关系
     *
     * @param year  当前活动年份
     * @param order 当前活动次数
     * @param week  当前活动周数
     * @return 负责表id集合 (用于判断是否有数据)
     */
    List<Integer> getManagerCorrespondenceId(@Param("year") Integer year, @Param("order") Integer order, @Param("week") Integer week);

    /**
     * 删除本周的负责匹配关系 -- 用于在重新生成本周‘负责人与成员的匹配关系’时先将原数据删除
     *
     * @param year  当前活动年份
     * @param order 当前活动次数
     * @param week  当前活动周数
     */
    void deleteThisWeekManagerCorrespondence(@Param("year") Integer year, @Param("order") Integer order, @Param("week") Integer week);

    /**
     * 删除本周的成员任务提交结果记录 -- 用于在重新生成本周‘负责人与成员的匹配关系’时先将原数据删除
     * 后加的表，用于记录成员上传每周任务完成情况，逻辑加在生成每周负责匹配关系中
     *
     * @param year  当前活动年份
     * @param order 当前活动次数
     * @param week  当前活动周数
     */
    void deleteThisWeekUserSubmitResult(@Param("year") Integer year, @Param("order") Integer order, @Param("week") Integer week);

    /**
     * 通过学号获取当前活动的负责人
     *
     * @param username 学号
     * @return 负责人信息
     */
    SapSawbsMangers getSawbsManagerMessageByUsername(@Param("username") String username);

    /**
     * 创建活动
     */
    void createActivity(@Param("activity") Activity activity);

    /**
     * 获取该负责人的被负责人信息
     */
    List<DetailsUser> getManagerUsers(@Param("dynamicMessage") DynamicMessage dynamicMessage, @Param("username") String username);

    /**
     * 通过动态表的时间获取当前所有的对应关系
     */
    List<ManagerCorrespondence> getAllMangerCorrespondenceDefaultByDynamicTable(@Param("dynamicMessage") DynamicMessage dynamicMessage);


    /**
     * 通过被负责人的id获取到对应负责人的id
     *
     * @param userId         被负责人的id（学号）
     * @param dynamicMessage 动态表的信息
     * @return 负责人的学号
     */
    String getMangerId(@Param("userId") String userId, @Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 通过学号获取这个学号是否拥有负责人的信息，如果拥有则返回信息
     *
     * @param username 学号
     * @return 负责人信息
     */
    SapSawbsMangers getSapSawbsMangers(@Param("username") String username);

    /**
     * 成员退出
     *
     * @param year     活动年份
     * @param order    活动次数
     * @param userName 用户名(学号)
     */
    void memberExit(@Param("year") Integer year, @Param("order") Integer order, @Param("userName") String userName);

    /**
     * 管理员退出
     *
     * @param year     活动年份
     * @param order    活动次数
     * @param userName 用户名(学号)
     */
    void managerExit(@Param("year") Integer year, @Param("order") Integer order, @Param("userName") String userName);

    /**
     * 获取本周学习任务
     *
     * @return 本周学习任务
     */
    SapSawbsTask getTaskThisWeek();

    /**
     * 获取本次活动每周的学习任务(集合)
     *
     * @return 本次活动每周的学习任务集合
     */
    List<SapSawbsTask> getTaskThisOrder();

    /**
     * 获取指定活动每周的学习任务(集合)
     *
     * @param year  指定活动的年份
     * @param order 指定是此年的第几次活动
     * @return 指定活动每周的学习任务集合
     */
    List<SapSawbsTask> getTaskByCondition(@Param("year") Integer year, @Param("order") Integer order);

    /**
     * 将学习小组每周的学习情况写入
     *
     * @param sawbsMessageVo 学习情况
     */
    void writeSawbsMessageVo(@Param("sawbsMessageVo") SawbsMessageVo sawbsMessageVo);

    /**
     * 查看是否存在责任关系
     *
     * @param sawbsMessageVo 学习情况
     * @return 关系的条数
     */
    Long existResponsibilityRelations(@Param("sawbsMessageVo") SawbsMessageVo sawbsMessageVo);

    /**
     * 查询自己本周的学习情况
     *
     * @param sawbsMessageVo 存储时间信息
     * @return 学习情况
     */
    SawbsMessageVo getWeekScore(@Param("sawbsMessageVo") SawbsMessageVo sawbsMessageVo);

    /**
     * 查询某一届学习小组的成员信息
     *
     * @param year 学年
     * @return 成员信息
     */
    List<SawbsUser> getUsersActivityMessageOfYear(@Param("year") Integer year);

    /**
     * 获取当前的软协小队活动详细信息
     *
     * @return 当前的软协小队活动详细信息
     */
    SapSawbsActivity getThisSawbsActivity();

    /**
     * 查询指定小队活动的详细信息
     *
     * @param year  活动年份
     * @param order 活动次数
     * @return 指定小队活动的详细信息
     */
    SapSawbsActivity getSawbsActivityByCondition(@Param("year") Integer year, @Param("order") Integer order);

    /**
     * 获取所有小队活动的详细信息 (按活动的时间(年份和次数)从近到远排序 年份从大到小，次数从大到小)
     *
     * @return 所有小队活动的详细信息集合 (按活动的时间(年份和次数)从近到远排序)
     */
    List<SapSawbsActivity> getAllSawbsActivities();

    /**
     * 添加每周任务
     *
     * @param taskForWeek 周任务字段
     */
    void addTaskForWeek(@Param("task") TaskForWeek taskForWeek);

    /**
     * 修改学习情况
     *
     * @param sawbsMessageVo WeatherUtil
     */
    void updateSawbsMessageVo(@Param("sawbsMessageVo") SawbsMessageVo sawbsMessageVo);

    /**
     * 修改周任务
     *
     * @param taskForWeek 所需要的参数
     */
    void updateSawbsTask(@Param("task") TaskForWeek taskForWeek);

    /**
     * 根据管理员学号获取本周负责的成员的学号集合
     * (根据动态表数据查询)
     *
     * @param managerUserName 管理员学号
     * @return 本周负责的成员的学号集合
     */
    List<String> getSawbsUserUsername(@Param("managerUserName") String managerUserName);

    /**
     * 查找本周该成员是否已被评分
     *
     * @param username 成员学号
     * @return 评分表ID (用于判断是否已评分)
     */
    Integer getSawbsScoreIdThisWeek(@Param("username") String username);

    /**
     * 修改本周的负责匹配关系
     *
     * @param managerUserName 新负责的管理员学号
     * @param username        成员学号
     */
    void updateWeeklyManagerMatchingRelationship(@Param("managerUserName") String managerUserName, @Param("username") String username);

    /**
     * 查询每周任务总结表
     *
     * @param summary 任务总结表的时间
     * @return 任务总结表的list
     */
    List<SapSawbsTaskSummary> getSummaryMessage(@Param("summary") SawbsSummaryDto summary);

    /**
     * 获取这次活动的名字
     *
     * @return 活动名字
     */
    String getOrderName(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取任务总结的URL
     *
     * @return 图片URL组成的List
     */
    List<SapSawbsTaskSummaryImage> getTaskSummaryImageUrl();

    /**
     * 添加总结表内容
     *
     * @param sawbsTaskSummary 任务表内容
     */
    void addTaskSummaryMessage(@Param("sawbsTaskSummary") SawbsTaskSummary sawbsTaskSummary);

    /**
     * 插入总结表图片
     *
     * @param sawbsSummaryDto 内容信息
     */
    void addTaskSummaryImage(@Param("sawbsSummaryDto") SawbsSummaryDto sawbsSummaryDto);

    /**
     * 修改总结表
     *
     * @param sawbsTaskSummary 总结信息
     */
    void updateTaskSummaryMessage(@Param("sawbsTaskSummary") SawbsTaskSummary sawbsTaskSummary);

    /**
     * 修改总结表的图片
     *
     * @param sawbsSummaryDto 内容信息
     */
    void updateTaskSummaryImage(@Param("sawbsSummaryDto") SawbsSummaryDto sawbsSummaryDto);

    /**
     * 获取当前周的分数信息
     *
     * @param dynamicMessage 当前周
     * @return
     */
    List<SapSawbsScore> getScoreForWeek(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取任意一年的分数信息
     *
     * @param year 任意一年
     * @return
     */
    List<SapSawbsScore> getScoreForAnyYear(Integer year);

    /**
     * 获取个人用户任意一周分数
     *
     * @param dynamicMessage 周数
     * @return ..
     */
    List<SapSawbsScore> getScoreForUser(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取个人的分数总分表
     *
     * @param year     学年
     * @param order    活动次序
     * @param username 学号
     * @return ..
     */

    List<SapSawbsScore> getScoreSumForUser(@Param("year") Integer year, @Param("order") Integer order, @Param("username") String username);

    /**
     * 获取当前用户任意一周的负责人
     *
     * @param dynamicMessage 参数信息
     * @return ..
     */
    UserToManagerVo getUserManagerForWeek(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取学习小组成员和负责人对应关系表
     *
     * @param year     学年
     * @param order    活动次序
     * @param username 学号
     * @return ..
     */
    List<SapSawbsManger> getSapSawbsManger(@Param("year") Integer year, @Param("order") Integer order, @Param("username") String username);

    /**
     * 获取用户最后一次活动的信息
     *
     * @param username 学号
     * @return
     */
    SapSawbsScore getSapSawbsScoreByUserLastOrder(@Param("username") String username);

    /**
     * 获取所有举办过活动的年份
     *
     * @return 所有年份
     */
    List<Integer> getAllRecordYear();

    /**
     * 通过年份获取到该年的所有次数
     *
     * @param year 查询某年
     * @return 所有次数
     */
    List<Integer> getAllRecordOrderForOneYear(@Param("year") Integer year);

    /**
     * 通过年份和次数获取对应的最大周期
     *
     * @param year  某年
     * @param order 某次
     * @return 所有周期
     */
    Integer getMaxRecordWeekForOneOrder(@Param("year") Integer year, @Param("order") Integer order);

    /**
     * 增加活动次数记录 --> record_table表
     */
    void addActivityOrderForRecordTable(@Param("year") Integer year, @Param("order") Integer order);

    /**
     * 将该表的week + 1
     */
    void updateToAddOneWeekForRecordTable(@Param("year") Integer year, @Param("order") Integer order);


    /**
     * 获取负责人任意周对应的用户(个人)
     *
     * @param dynamicMessage 年份日期
     * @return
     */
    List<ManagerVo> getManagerForUserWeek(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取负责人负责过哪几个学年的学习小组
     *
     * @param username 学号
     * @return
     */
    List<Integer> getManagerYear(@Param("username") String username);

    /**
     * 添加用户到当前活动的学习小组
     *
     * @param dynamicMessage 动态信息
     */
    void applySapStudy(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 获取用户是否已经存在当前活动
     *
     * @param dynamicMessage 动态信息
     * @return 如果是null则没存在，如果不是null则已经存在
     */
    SapSawbsUser getSapSawbsUser(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 退出当前学习活动
     *
     * @param dynamicMessage 动态信息
     */
    void quitSawbs(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /*以下全都是用户上交每周任务的相关SQL*/

    /**
     * 判断用户当前周是否已经提交了笔记或者作业或者任务结果
     *
     * @param dynamicMessage 动态信息
     * @return
     */
    SapSawbsUserResults isSubmitForUserTask(@Param("dynamicMessage") DynamicMessage dynamicMessage);

    /**
     * 当用户提交笔记或者作业或者任务结果的时候，修改他的记录为已提交状态，并且更新提交时间以及提交的.md文件的URL
     *
     * @param dynamicMessage 动态信息
     * @param time           时间
     * @param url            .md文件URL
     */
    void submitTaskForWeek(@Param("dynamicMessage") DynamicMessage dynamicMessage, @Param("time") Timestamp time, @Param("url") String url);

    /**
     * 修改提交的笔记或者作业或者任务结果
     *
     * @param dynamicMessage 动态信息
     * @param url            文件url
     */
    void updateSubmitTaskForWeek(@Param("dynamicMessage") DynamicMessage dynamicMessage, @Param("url") String url, @Param("time") Timestamp time);
    /*以上全都是用户上交每周任务的相关SQL*/

    /**
     * 通过年，次，周获取当前用户任务提交的信息
     *
     * @param year   年
     * @param order  次
     * @param week   周
     * @param submit 提交状态
     * @return 具体信息
     */
    List<SapSawbsUserResults> getTaskInfoByYearOrderWeek(@Param("year") Integer year, @Param("order") Integer order, @Param("week") Integer week, @Param("submit") Integer submit);

    /**
     * 获取每周负责人负责的人员上交信息
     *
     * @param year     学年
     * @param order    活动
     * @param week     周数
     * @param username 用户
     * @return 上交信息
     */
    List<SapSawbsUserResults> getTaskInfoByUsername(@Param("year") Integer year, @Param("order") Integer order, @Param("week") Integer week, @Param("username") String username);

    /**
     * 通过学号获取当前活动没有上交作业的次数
     * @param username 学号
     * @param year 学年
     * @param order 活动次序
     * @return
     */
    Integer getNotSubmitTaskMore(@Param("username") String username, @Param("year")Integer year, @Param("order")Integer order);

    /**
     * 获取当前周没有上交任务的同学信息
     * @param year 年
     * @param order 活动次数
     * @param week 周数
     * @return 信息
     */
    List<SapSawbsUserResults> getNotSubmitTaskPeople( @Param("year")Integer year, @Param("order")Integer order,@Param("week")Integer week);
}
